
>>>>>>>>>>>>>>>>>>>>> CP/M-Net News <<<<<<<<<<<<<<<<<<<<<<<<

============================================================
Number 4		May, 1981	   Volume 1, Issue 5
============================================================

		      In This Issue
		      =============

		   RCPM Midwest Update
		     by: Ben Bronson

      Computer Widows: To the wifes, girlfriends, etc.
	      by: Jane Smith, Wife of "SYSOP"

    MP/M: A User's Comments and Implementation Methods
		     by: Kelly Smith

		CP/M-Net "Tip-of-the-Month"
  Seven Byte Program to Discourage TRACE with DDT or SID
	     by: Kelly Smith, CP/M-Net "SYSOP"


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

		    RCPM Midwest Update
		    ===================
		      by Ben Bronson

 The  big news in these parts as far as programs go  is  (1)
MicroTelnet (MTN21.OBJ, DOC, MSG, & MTNMSGS.OVR), a splendid
new terminal program by one of your California people, Frank
Wancho (Maybe not a Californian,  come to think of it);  (2)
FINDBD52,  Ron Fowler's long-awaited "universal" FINDBAD [he
has  used the tricks he invented for DU-V75 to make it	work
for  just  about  any  controller  without  bothering  about
assembly  options];  and  (3) RUN80,  which came  here	from
Dick's system and you know about already. Also an assortment
of smaller programs.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

      Computer Widows: To the wifes, girlfriends, etc.
      ================================================
		by Jane Smith, Wife of "SYSOP"

 When Kelly asked me if I would be interested in writing  an
article  for his "newspaper",  my first response was  "NO!".
First  of  all,  I have no training in article	writing  and
secondly  being a housewife,  hanging around with the  kids,
dog,  cats,  etc.,  all  day  doesn't tend to increase	ones
vocabulary.  Well,  I take that back...I've learned lots  of
four letter words,  mostly in self-defense!  But then, after
thinking it over,  I thought "What the hell" (there's one of
those four letter words!).

 I  think  this  "home computer" thing started  when  Pertec
(where Kelly works) loaned us a TRS-80 to play with at home.

[Editor Comment:  they were having me evaluate it, to see if
we could make one better and cheaper!].

 We  had  lots of fun playing games on it and even  kind  of
missed it when it went back to Pertec. So Kelly put together
a little system for us at home...It has ballooned from there
to  the  point	of  adding a room onto	our  house  for  the
computers, complete with it's own air conditioning unit (God
forbid, it should get too hot!).

 I  probably wouldn't be too far off to say that 85% of  the
time that Kelly is home,  he is with the computers,  another
5%  is spent thinking about it (you can always tell by	that
blank  stare  into space),  probably 7% devoted  to  eating,
sleeping,  etc.,  and maybe I get 3%.  I get the  impression
that  the  computer  doesn't like me...it usually  plans  on
breaking about the time Kelly and I are going to spend	some
time together.

 An  example of it's dislike for me was the time Kelly	went
on  a  business trip for two weeks and left me in charge  of
running the computer.  As soon as it figured out that  Kelly
had gone (and had not taken it along), it decided to throw a
fit  and not talk to anyone when they called!  So  everytime
the  phone would ring,	I had to run in "it's room" and  re-
boot  the system...a good friend of Kelly's kindly came over
to have a look at it.  It ran fine for him all day,  but  as
soon  as  he was in his car it said "DISK BOOT  ERROR".  The
last thing I did before going out the door to pick up Kelly,
was to re-boot the system.  The minute Kelly stepped in  the
door,  it straightend right up and never to my knowledge did
it do that again.  I beleive its jealous and that was one of
its  little plots to make Kelly think that I'm the one	with
the loose screw...

 I  also  find	it difficult to join in  conversations	when
Kelly's friends come to visit. They sit around and talk in a
foreign language!  I've tried to join in once or twice,  and
usually  come up with some intelligent phrase (just  to  get
your  foot  in the door) like "Boy,  something really  funny
happened on the way to the grocery store!"...at which  point
(if they even heard you), you get a blank stare as if you're
the  one  talking in a foreign language!  Then without	even
asking	"what  was  funny?" the conversation  goes  back  to
"SYSGEN" this, or "PIP" that, or "star-dot-doc".

 Do you remember when we were teenagers and we'd invent some
language such as "pig-latin" to talk to our friends,  so our
parents wouldn't understand what we were saying? Sometimes I
think that's what these guys are doing, and they're planning
a  "Stepford"  community...what they're really  spending  so
much time doing is making "Stepford Wives"! I, for one, have
warned my friends to keep a close eye one me for any changes
along those lines...

 I'm  also watching for the program "star-dot-sex".  That'll
mean it's finally programmed for sex, and there goes my 3%!

 I'm  sure  that this isn't what Kelly had in mind  when  he
asked  for  an	article,   but	maybe  some  of  the  wives,
girlfriends, etc., can identify with this...

 To  sum up,  I must say that I am glad that you're at	home
Kelly...even if you are with the computer.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    MP/M: A User's Comments and Implementation Methods
    ==================================================
	      by Kelly Smith, CP/M-Net "SYSOP"

 Up front, let me recommend that MP/M is NOT for someone who
doesn't  know the difference between a 'NOP' and an  'XTHL'!
All  those  that  fail	this  test,  please  read  the	next
article...this	is definetely not for you.  MP/M is NOT  for
someone that has NOT PURCHASED CP/M 2.2, and MP/M is NOT for
someone  who has purchased CP/M 2.2 but does NOT have a copy
of  the ENTIRE BIOS (i.e.,  that means ANYONE who has  taken
the  "easy way out" by buying a ready to run CP/M  2.2  from
Lifeboat Associates).  Also,  I suspect that MP/M is NOT for
someone  who has ALREADY purchased a microprocessor  system!
"What?" you ask...well since I have your attention this far,
read on.

 MP/M	is  a  powerful  multi-tasking/multi-user  operating
system that in the hands of the skillful user, a system-wise
('wise' meaning darned smart!) implementor,  and the  PROPER
hardware environment, can be a very useful software tool.

 As  always,  Digital  Research provides less than  adequate
documentation  for  explaining "how to get it  running"  for
anyone	with  less  than  a  Master's  Degree  in   Computer
Sciences...it can be done,  but you better really "dig  in",
learn to "read between the lines", and CAREFULLY EXAMINE the
program  examples given (the MP/M 1.0 release  documentation
had  a few "bugs" that if used,  would not  work!).  Digital
Research  has done an excellent job on their PL/I-80 and BT-
80,  manuals  however...but I always wondered why they	kept
putting  those	PL/M examples in their CP/M manuals  (as  if
everyone  programmed in PL/M and had an  Intel	MDS-800...oh
well).

 O.K.,	so you ARE an expert,  and (let's hope) you have NOT
purchased  a  microcomputer  system  (Oh  yeah,   forgot  to
mention: it MUST BE a 8080/Z80 based system!). Let's examine
my  implementation of MP/M on a typical "semi-roll-your-own"
microcomputer...in  this  case,   an  IMSAI  8080  with   56
kilobytes  of  RAM,  two floppies,  one "local user" with  a
terminal,  and one "remote user" (via an auto-answer modem).

 The  system "boot and signon" will best illustrate WHY  you
should NOT purchase a microcomputer system...so here is what
USER 1 (remote) will see at signon:


    MP/M-Net (tm), System #1 <--- (autoload under CP/M 2.2)
>> Multi-user Software Access <<
	    [USER 1] <--- (your user number)

Enter USER 0<cr>, if you require
access to other MP/M facilities.
===============================
 MP/M is a registered trademark
	       of		 <--- (giving credit!)
	Digital Research
===============================
Booting MP/M Version 1.1 now.... <--- (a slight pause)
MP/M 1.1 Loader <--- (MP/M "boot loader", MPMLDR.COM)
===============
Number of consoles =  2 <--- (indicates 2 user configuration)
Breakpoint RST #   =  5 <--- (SID or DDT "break-point" vector)
Top of memory	   =  DFFFH <--- (56 Kilo-bytes of memory)
Memory Segment Table:
SYSTEM	DAT  DF00H  0100H <--- (system configuration data)
CONSOLE DAT  DD00H  0200H <--- (system user console data)
USERSYS STK  DC00H  0100H <--- (system user stack area)
XIOS	SPR  D800H  0400H <--- (extended I/O system process's)
BDOS	SPR  C400H  1400H <--- (basic disk operating system)
XDOS	SPR  A500H  1F00H <--- (extended disk operating system)
ABORT	RSP  A400H  0100H <--- (resident system process, abort)
MPMSTAT RSP  9700H  0D00H <--- (resident system process, MP/M status)
Sched	RSP  9200H  0500H <--- (resident system process, scheduler)
-------------------------
Memseg	Usr  8000H  1200H <--- (memory for user 0,  4 Kilo-bytes)
Memseg	Usr  0000H  8000H <--- (memory for user 1, 32 Kilo-bytes)

MP/M 1.1 <--- (MP/M "sign-on")
1A> <--- (MP/M prompt for user 1)

 Now examine the signon carefully...EGADS! A 56k system, and
only 36 kilobytes left BETWEEN USER 0 and USER 1...and whats
worse,	is  that  resident  system process's  for  TIME  and
SPOOLER  can't be included without giving up some meaningful
amount of memory for user application programs!  ARGH...here
I sit with $8,000 worth of hardware and I can't run diddely!

 So get the picture?  Now it's the old "whip-out-the-wallot-
time-again-folks" syndrome..."let's see, just how much bank-
switched  memory can I get for...oh heck, got'ta pay Ma'Bell
first,	for  that  three hour modem transfer  from  Bruce!".
Well,  as I said...DO NOT purchase the computer FIRST!  Make
some strong considerations as to WHY you think you need MP/M
then  start configuring a system (on paper) with  what  your
requirements will be and,  of course the final problem: will
my  wife  let me buy it?  (!).  I would suggest that  for  a
meaningful environment for MP/M to "live in", you want about
128 Kilobytes of bank-switched memory...that's for just  two
"hackers"  on the system...and maybe,  JUST MAYBE,  allowing
one  of you to be zapping Klingons while the other is  going
"Oooh Aaah" with Wordstar. But then, things get worse:

 So you've got memory "up-the-kazoo" huh?  Great, so we just
rip  along (both users hacking away),  and you got  the  TOD
(time  of  day) set and you "schedule" an assembly for  your
wiz-bang newest program...but wait,  that means a  real-time
clock...ARGH again!  Well let's see,  maybe if I turn in ALL
the Coke bottles, and...

 Now  we  have a real-time clock board,  and it  includes  a
"tick-toc"  interrupt that we had to have anyway for "round-
robin" polling of all the darned hardware...couldn't  afford
to go fully interrupt driven (in fact I scrounged a MITS 88-
VI/RTC  board from a friend!).  Oh yah...change the XIOS  to
disable  interrupts  during floppy disk DMA (we got  one  of
those (GAG) Tarbell Double Density disk controllers).

 So  back to scheduling that assembly...Hmmm,  we seem to be
running  a  little  late...let's look  at  the  system  with
MPMSTAT...no,  the  suckers on the queue...must be coming up
soon.  Well  let's  see  what time it is  according  to  the
system...(we type in TOD<cr>).  WHAT THE HECK???  The darned
clock is late! NOW WHAT (mumble, mumble)?

 Well  SON-OF-A...Oops,  won't go to heaven if we keep  this
up!  Turns out that to run the disk,  we had to turn of  the
interrupts,  and since we did that, the clock lost time, and
we can't run the schedular properly...now comes ARGH #3.

 Where  do I find a disk controller that doesn't DMA or  hog
the buss,  or...worst yet, if I find one, HOW will I pay for
it!?!  Let's see,  could I sell my wife to the mo'cycle gang
down the street?

 O.k.,  got a heck of a deal on her for $3,500...just enough
to pay for a "buffered" (read "grab data at our leisuer, not
at  the disk data rate" here) double density disk controller
from Pertec (An OBVIOUS plug: Model FD3812 or single density
FD3712)...but, OH CRAP (and diddely-squat!)!  Now I have  to
rewrite my MPMLDR and XIOS...(weep, ARGH #4).

 Now  I've developed the MPMLDR and XIOS (and of course I've
also developed this annoying 'tick' and people wonder why  I
keep  jamming  the fork into my forehead when  I  eat)...but
this  is part of the FUN OF IT ALL...Right?  So now we  fire
the  turkey computer up again...WOW!  FAR OUT!  Time of  day
clicking right along,  schedular bashing programs,  on time,
keyboard  getting overrun...WHAT?  KEYBOARD  OVERRUN???  Now
WHAT????

 We examine the system with MPMSTAT again...Hmmm,  that jerk
on  USER  1 is still playing Startrek.  Well what  could  be
going  on?  Let's think about Startrek for a  minute...let's
see,  setting up arrays, figuring navigation, just plain old
compute bound stuff...Ooops!  COMPUTE BOUND!  That's IT! One
piddely  little 8080 CPU (beating it's heart out) trying  to
handle  some  heavy-weight  computations while  I  sit  here
slogging  it out with this text editor...ARGH #5.  Well this
ones  a "tuffy",  'cause now I have to go totally  interrupt
driven...and the story goes on, and on and...

 So  that  story summarizes the agony of the  potential  for
disaster if you DON'T PLAN AHEAD.  So what did we learn from
all this?  Well I figure that we spent about $7,000, my wife
is living with a bunch of Harley Freaks, and I got canned at
work  because of the obscene things I was doing with a	fork
in  the  company cafeteria.  I could have had  two  SEPERATE
computers  and	REALLY IMPRESSED the guys  at  the  computer
club!

 Well  in any case,  let's see what we can do with MP/M,  so
first we'll see whats going on in the system with MPMSTAT:

1A>mpmstat<cr> <--- ( we type this in...)


***** MP/M 1.1 Status Display ****** <--- (MP/M responds)

Top of memory = DFFFH <--- (yah, 56k; it was just a story!)
Number of consoles = 02
Debugger breakpoint restart # = 05
Stack is swapped on BDOS calls

Ready Process(es):
  MPMSTAT  Idle
Process(es) DQing:
 [ABORT   ] ABORT
 [Sched   ] Sched
 [CliQ	  ] cli
 [ATTACH  ] ATTACH
Process(es) NQing:
Delayed Process(es):
Polling Process(es):
  Tmp0	
Process(es) Flag Waiting:
  01 -	Tick	
  02 -	Clock	
Flag(s) Set:
  03
Queue(s):
  ABORT    MPMSTAT  Sched    CliQ     ATTACH   MXParse	MXList	
  MXDisk
Process(es) Attached to Consoles:
  [0] - Tmp0	
  [1] - MPMSTAT
Process(es) Waiting for Consoles:
  [1] -  Tmp1	
Memory Allocation:
  Base = 0000H	Size = 8000H  * Free * <--- FREE Hell! 56k cost
  Base = 8000H	Size = 1200H  * Free *	    me almost $1,600!!!
1A> <--- (MP/M waiting to do your bidding)

 "Well,  what does it all mean?" you ask. So here is a brief
explanation:

Ready  Process(es) - process(es) that are ready to  execute,
		     and  waiting  for the system  (CPU)  to
		     relinquish time.  In this case  MPMSTAT
		     has    the    highest   priority	 and
		     momentarily has control.

Process(es) DQing  - processes	that  are   waiting   for
		     'messages' from the queues that are  in
		     brackets, and displayed from highest to
		     lowest system priority.

Process(es) NQing -  processes writing to queues,  but	none
		     at this time in progress.

Delayed  Process(es)  - processes  waiting for	a  specified
		     amount  of  clock 'ticks' on the  basic
		     system time unit,	but none waiting  at
		     this time.

Polling  Process(es) - Terminal Message Process USER  0,  is
		     polling the console device.

Process(es)  Flag  Waiting  - processes that set  and  alter
		    "syncronization flags" for task building.

Flag(s) Set -	    the flag indicating that the "one minute
                    interval" is set.

Queue(s)  -	     all the present queues on	the  system;
		     the  queues in upper case	letters  may
		     receive  messages from the Command Line
		     interpreter (e.g., ABORT followed by  a
		     filename).

Process(es)  Attached to Consoles - processes 'attached'  to
		     the console,  listed by console  number
		     (user)  and  process name...USER 0  has
		     gone to sleep.

Process(es) Waiting for Consoles - Terminal Mesage Processor
		     USER 1 is waiting for console  1,	from
		     which it was 'detached'.

Memory Allocation -  unallocated user memory segments;	will
		     indicate  which  programs	are  activly
		     executing	and  to  which	user  it  is
		     assigned.	 Currently  non-active,  but
		     then what can you do in 38k anyway with
		     two users?

 If you care to set the "time of day", then enter the month,
day, year, hour, minute, and second, as follows:

1A>TOD 10/04/81 07:35:00<cr> <--- (you enter this)
Strike key to set time<cr> <--- (MP/M responds, you do <cr>)

Sat 10/04/81 07:35:00	    <--- (the current "time of day")

 Now  you  may want to "schedule" a task to be  executed  at
some later time by MP/M.  For example, schedule the "time of
day"  to  be  displayed  exactly two  minutes  from  now  by
entering the following scheduler command:

1A>SCHED 10/04/81 07:37:00 TOD<cr>

 Two minutes "tick" by...

1A>Sun 10/04/81 07:37:01    <--- ("time of day" is executed)

 The  SCHEDuler  works	with all file  and  resident  system
process's,  and  allows the user to "stack" a  multitude  of
tasks on the system for later (and unattended) execution.


 Keeping  in mind that you are USER 1,	you may display  the
directory for the diskette in drive A as follows:


1A>dir<cr>		<--- (you type DIR, carriage return)

Directory for User  1:
A: MESSAGE  X12 : KILLED       : MESSAGE  X08 : MESSAGE  X06
A: MESSAGE  X02 : MESSAGE  X04 : MESSAGE  X00 : CBBS	 COM
A: WELCOME	: SCANHELP     : PASSWORD     : LOG	
A: MESSAGE  X10 : HELP	       : FIRSTIME     : ENTRHELP
A: ENTINTRO	: BULLETIN     : NEXT	      : MESSAGE  X20
A: NOT-FOR  YOU : USER	   ASM : DUPUSR   ASM : FILE-XT2 ASM
A: SYSTEM'S DOC : XMODEM   COM : MESSAGE  X14 : MESSAGE  X16
A: MESSAGE  X18 : SUMMARY

 Now  you  may	wish to see what's "on file" in  other  user
areas.	For example,  all the MP/M "system" files are in the
USER 0 area of the diskette in drive A:

1A>user 0<cr>	     <--- (you type USER 0, carriage return)
User Number = 0

0A>dir<cr>	    <--- (...and DIR, carriage return again)

Directory for User  0:
A: MPM	    SYS : LDRBIOS  ASM : ODOS	  SPR : BDOS	 SPR
A: BNKBDOS  SPR : XIOS	   ASM : ABORT	  RSP : SPOOL	 RSP
A: MPMSTAT  RSP : SCHED    RSP : CONSOLE  PRL : DIR	 PRL
A: DSKRESET PRL : ERA	   PRL : ERAQ	  PRL : MPMSTAT  PRL
A: PRLCOM   PRL : REN	   PRL : SUBMIT   PRL : TOD	 PRL
A: TYPE     PRL : USER	   PRL : SPOOL	  PRL : STOPSPLR PRL
A: SCHED    PRL : ABORT    PRL : ED	  PRL : PIP	 PRL
A: STAT     PRL : RDT	   PRL : ASM	  PRL : GENMOD	 COM
A: GENHEX   COM : LOAD	   COM : GENSYS   COM : SUBMIT	 COM
A: XDOS     SPR : MAC	   COM : MPMLDR   COM : SYSTEM	 DAT
A: XIOS     SPR : DISKDEF  LIB : ASMPRL   SUB : ASMSPR	 SUB
A: MACPRL   SUB : MACSPR   SUB
0A>

 Now,  stop and consider this: ALL those "built in" commands
that  you  used in CP/M 1.4 and 2.2 are now  DISK  RESIDENT.
That means they take up ROOM on your diskette!	And precious
little	room there is,	'cause the resident system processes
also  have to be on the disk,  and in addition it  would  be
nice  to  have	some applications programs to run  when  two
users are on the same diskette...I sure hope that was double
density  that we bought for the system...a standard  8	inch
floppy can just about hack it with two users.

 In  conclusion,  I  would NOT suggest MP/M for the  average
"hacker"...the  cost-versus-performance  on  a  low   budget
system	is  something  of a disappointment if  you  are  not
prepared to empty your checking account (or sell your wife!)
to  add  the hardware that is essential to make MP/M  really
"shine".  Your  hardware/software dollars would probably  be
better	spent on a second system,  as the  "work-horse"  for
printing  and  number crunching while you edit and  assemble
programs on the first.	In any case, it was a fun experience
and I did learn alot about system planning/design, interrupt
driven software environments,  and just how far you can push
one 8080 CPU!  I hope that my experience is of some help  to
you......now where's that CP/Net manual?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

		 CP/M-Net "Tip-of-the-Month"
		 ===========================

  Seven Byte Program to Discourage TRACE with DDT or SID
  ======================================================
	      by Kelly Smith, CP/M-Net "SYSOP"

 Here's a simple routine to add to any program to discourage
anyone	from tracing (and revealing) your program's internal
operation. In it's simplist form:

check$ddt$or$sid:   ; check if program is being looked at
;
     lda  6	    ; get content of address 6
     ora  a	    ; set flags
     jz   banzai    ; use what ever means you think fit to
		    ; clobber this guy...
;
     ...	    ; continue normal execution of program

 This  short  routine works as follows:  Address  6  is  the
(normally)  least  significant	byte of the  address  to  be
called	for any operations of the CP/M BDOS (the CALL is  at
address  5),  and  as  such it's value is  06  Hex.  Digital
Research's  DDT and SID debugger programs,  when present  in
the system,  always leave a CALLing address on an EVEN	page
boundry  in memory at address 6...this means that address  6
will  have  a 00 Hex byte for the least significant byte  of
the  address...so this routine simply checks to see  if  the
address  is 0!	Now if it is,  you can BANZAI the  continued
operation  of the TRACE by...hmmm,  erase the disk directory
(?),  or  erase  ALL of memory (?),  or...well you  get  the
point.	To  be really clever with this,  save the result  of
address  6...let the jerk trace for awhile to lose track  of
why  you  did the LDA 6,  then set  the  flags,  run  awhile
longer,  then  (after he/she has forgotten that also)  check
the result of the flags...

 P.S.  This  will not work with FAST running in  conjunction
with your program, so watch out! Also, my prefered method to
BANZAI the person trying to "tear apart" my software,  is to
scramble   the	 program,   then  write  it  back   out   to
disk...remember,  that BDOS CALL's cannot be traced  anyway,
so  about  the	time that the "tracer"  realizes  that  file
open/write/close occurs...it's just to late!

